/* Sockets en mode stream; proto tcp ; Ici client.
   Ce programme -clededix- expedie le numero (uid) du proprietaire du
   precossus et attend en reponse le nom du l'utilisateur
   correspondant

   Ici le num'ero de port du serveur est pass'e en param`etre.
 */
using namespace std;
#include <stdio.h> //pour perror
#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <netdb.h>
#include "sock.h"
#include "sockdist.h"

main(int argc, char *argv[])
  {

   if (argc != 3){
      printf("utilisation : clededix machine_du_serveur numport\n");
      exit(0);
      }
   /* etape A : BR locale sans numero predefini */
   Sock brCli(SOCK_STREAM, 0);
   int descBrCli;
   if (brCli.good())descBrCli=brCli.getsDesc();
   else{
     cout <<"pb Br locale"<<endl;
     exit(0);
   }

   /* etape B : On designe la BR du serveur */
   SockDist brPub(argv[1], short(atoi(argv[2])));
   struct sockaddr_in * adrBrPub=brPub.getAdrDist();
   int lgAdrBrPub=sizeof(struct sockaddr_in);

   /* etape C : la demande de connexion */
   cout <<"ici client; on va demander une connexion "<<endl;;
   cout <<"return svp";
   cin.get();
   cout<<endl;
   int conn = connect(descBrCli, (struct sockaddr *)adrBrPub,lgAdrBrPub);
   if (conn <0){
      perror ("pb au connect :");
      close (descBrCli);
      exit (0);
   }

   /* etape D : la demande a abouti */
   cout <<"cote client on est apres le connect() ;\n"; 
   cout <<"return svp pour expedier l'uid";
   cin.get() ;
   cout <<endl;

   uid_t monUid=getuid();
   int snd = send (descBrCli, (const void *) &monUid , sizeof(monUid) , 0 ) ;
   if (snd < 0) {
      perror("clededix, pb au send:");
      close (descBrCli);
      exit (0);
      }


   /*  On consulte notre boite */
   char buffer[256] ;        /* pour les messages recus */
   int buffsz = sizeof (buffer) - 1;
   int rcv = recv (descBrCli, buffer, buffsz, 0) ;
   if (rcv < 0) {
      perror("clededix, apres recv:");
      close (descBrCli);
      exit (0);
      };
   /* message recu du serveur */
   buffer[rcv]='\0';
   cout <<"on a recu "<<rcv<<"caracteres"<<endl;
   cout <<"Recu ceci ==> " <<buffer<<endl;

close (descBrCli);
}
